package com.klun.designMode.template;

/**
 * 冒泡排序的模板方法--模板
 * @param <T>
 */
public abstract class BubbleSorter <T> {

    /**
     * 冒泡排序
     * @param array
     * @return
     */
    public int sort(T array){
        setArray(array);
        int length = getLength();

        int operations = 0;
        if(length <= 1){
            return operations;
        }
        for (int i = 0; i < length -1; i++){
            for (int j = 0; j < length -i -1; j++) {
                operations++;
                if(needSwap(j)){
                    swap(j);
                }
            }
        }
        return operations;
    }

    /**
     * 初始化排序数组
     * @param array
     */
    protected abstract void setArray(T array);

    /**
     * 返回数组长度
     * @return
     */
    protected abstract int getLength();

    /**
     * @return 是否需要交换数组中 index 和 index+1 元素
     * @param index
     * @return
     */
    protected abstract boolean needSwap(int index);

    /**
     * 交换array数组中的 index 和 index+1 元素
     * @param index
     */
    protected abstract void swap(int index);
}
